﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SIGEB.Modelo.moduloTipoDocumentos;
using SIGEB.Prototipo.control;
using SIGEB.Modelo.moduloPerfiles;

namespace SIGEB.Prototipo.Control
{
    public class controlTipoDocumento
    {
        #region "constructores"

        public controlTipoDocumento(controlPrincipal cp)
        {
            this.cp = cp;
        }

        #endregion

        #region "validación"

        public bool nombreValido(String nombre)
        {
            return Validacion.LongitudCadenaValida(nombre, true, 60);
        }

        public bool codValido(String codigo)
        {
            return Validacion.LongitudCadenaValida(codigo, true, 20);
        }

        public bool codAtrValido(String codigo)
        {
            return Validacion.LongitudCadenaValida(codigo, true, 20);
        }

        public bool camposAgregarValido(tipoDocumento nuevo)
        {
            return nuevo != null && nombreValido(nuevo.nombre);
        }

        public bool campoModificarValido(String cod, tipoDocumento nuevo)
        {
            return codValido(cod) && camposAgregarValido(nuevo);
        }

        public bool camposAtrAgregarValido(string idTipoDoc, string nombre, bool indizable, string tipo)
        {
            return codValido(idTipoDoc) && nombreValido(nombre) && Validacion.NumeroValido(tipo, true, false);
        }

        #endregion

        #region "métodos"

        public void agregarTipoDocumento(tipoDocumento nuevo)
        {
            if (!cp.usuarioActualPuede(acciones.TIPODOC_AGREGAR))
            {
                cp.ExcepcionUsrSinPermisos();
            }
            if (!camposAgregarValido(nuevo))
            {
                throw new Exception("campos invalidos");
            }
            cp.datos.tiposDocumentos.agregartipoDocumento(nuevo);
        }

        public void modificarTipoDocumento(String codigo, tipoDocumento nuevo)
        {
            if (!cp.usuarioActualPuede(acciones.TIPODOC_MODIFICAR))
            {
                cp.ExcepcionUsrSinPermisos();
            }
            if (!campoModificarValido(codigo, nuevo))
            {
                throw new Exception("campos invalidos");
            }
            cp.datos.tiposDocumentos.modificartipoDocumento(codigo, nuevo);
        }

        public void eliminarTipoDocumento(String code)
        {
            if (!cp.usuarioActualPuede(acciones.TIPODOC_ELIMINAR))
            {
                cp.ExcepcionUsrSinPermisos();
            }
            if (!codValido(code))
            {
                throw new Exception("campos invalidos");
            }
            cp.datos.tiposDocumentos.eliminartipoDocumento(code);
        }

        public LinkedList<tipoDocumento> obtenerTiposDocumento()
        {
            if (!cp.usuarioActualPuede(acciones.TIPODOC_CONSULTAR))
            {
                return new LinkedList<tipoDocumento>();
            }
            return cp.datos.tiposDocumentos.obtenerTiposDocumento();
        }

        public tipoDocumento obtenerTipoDocumento(String code)
        {
            if (!cp.usuarioActualPuede(acciones.TIPODOC_CONSULTAR))
            {
                return null;
            }
            if (!codValido(code))
            {
                throw new Exception("campos invalidos");
            }
            return cp.datos.tiposDocumentos.obtenertipoDocumento(code);
        }

        public void agregarAtributo(string idTipoDoc, string nombre, bool indizable, string tipo)
        {
            if (!cp.usuarioActualPuede(acciones.TIPODOC_AGREGAR))
            {
                cp.ExcepcionUsrSinPermisos();
            }
            if (!camposAtrAgregarValido(idTipoDoc, nombre, indizable, tipo))
            {
                throw new Exception("Campos atributo invalidos");
            }
            cp.datos.atributos.agregaratributo(new atributo(null, idTipoDoc, nombre, indizable, int.Parse(tipo)));
            
        }

        public void elimiarAtributo(string idAtributo)
        {
            if (!cp.usuarioActualPuede(acciones.TIPERF_ELIMINAR))
            {
                cp.ExcepcionUsrSinPermisos();
            }
            if (!codAtrValido(idAtributo))
            {
                throw new Exception("Campo Atributo Invaido");
            }
            cp.datos.atributos.eliminaratributo(idAtributo);
        }

        #endregion

        #region "atributos"

        controlPrincipal cp;

        #endregion
    }
}
